﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using BitBox.Framework.Util;
using BitBox.Framework.KBR.Model;
using BitBox.Framework.KBR.Model.Entity;

namespace BitBox.Framework.KBR.DAL
{
    public class RespostasDAL
    {
        #region /* Atributos Privados */

        private dcKBRDataContext dc;

        #endregion



        #region /* Métodos Privados */

        private IQueryable<fnTbRespostasResult> Select()
        {
            try
            {
                var result = (from Resp in dc.fnTbRespostas()
                              select Resp);
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion



        #region /* Métodos Públicos */

        /// <summary>
        /// Seleciona com base no info, filtrando de acordo com os campos preenchidos
        /// </summary>
        /// <param name="info"></param>
        /// <returns>Retorna uma lista</returns>
        public List<RespostasInfo> SelectByAnyFilters(RespostasInfo info)
        {
            List<RespostasInfo> retorno = new List<RespostasInfo>();

            try
            {
                dc = DALHelper.GetDataContext();

                var result = (from Resp in Select()
                              select Resp);
                // Se ID_PERGUNTA vier preenchido, acrescenta where
                if (!info.ID_PERGUNTA.Equals(0))
                    result = result.Where(re => re.ID_PERGUNTA.Equals(info.ID_PERGUNTA));
                // Se USER_NAME vier preenchido, acrescenta where
                if (!String.IsNullOrEmpty(info.RESPOSTA))
                    result = result.Where(re => re.RESPOSTA.Contains(info.RESPOSTA));

                retorno = LinqHelper<RespostasInfo, fnTbRespostasResult>.ListResultToInfo(result.ToList<fnTbRespostasResult>());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }
            return retorno;
        }

        /// <summary>
        /// Seleciona com base no ID_PERGUNTA
        /// </summary>
        /// <param name="RespId"></param>
        /// <returns>Retorna um elemento Info</returns>
        public RespostasInfo SelectByCode(int RespId)
        {
            RespostasInfo retorno = new RespostasInfo();

            try
            {
                dc = DALHelper.GetDataContext();

                var result = (from Resp in Select()
                              where Resp.ID_PERGUNTA == RespId
                              select Resp);

                RespostasInfo info = new RespostasInfo(result.SingleOrDefault());

                retorno = new RespostasInfo(info);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }
            return retorno;
        }

        /// <summary>
        /// Seleciona com base na Resposta
        /// </summary>
        /// <param name="UserName"></param>
        /// <returns>Retorna um elemento Info</returns>
        public RespostasInfo SelectByResposta(String Resposta)
        {
            RespostasInfo retorno = new RespostasInfo();

            try
            {
                dc = DALHelper.GetDataContext();

                var result = (from Resp in Select()
                              where Resp.RESPOSTA == Resposta
                              select Resp);

                RespostasInfo info = new RespostasInfo(result.SingleOrDefault());

                retorno = new RespostasInfo(info);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }
            return retorno;
        }

        /// <summary>
        /// Executa um Insert com base nas informações de um elemento Info
        /// </summary>
        /// <param name="info"></param>
        /// <returns>Retorna o Identity</returns>
        public int Insert(RespostasInfo info)
        {
            int RespId = 0;

            try
            {
                dc = DALHelper.GetDataContext();

                RespId = dc.PR_TB_RESPOSTAS_INSERT
                    (
                        info.ID_PERGUNTA,
                        info.RESPOSTA,
                        info.CERTA
                    );
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }
            return RespId;
        }

        /// <summary>
        /// Executa um Update com base nas informações de um elemento Info
        /// </summary>
        /// <param name="info"></param>
        public int Update(RespostasInfo info)
        {
            int RespId = 0;

            try
            {
                dc = DALHelper.GetDataContext();

                RespId = dc.PR_TB_RESPOSTAS_UPDATE
                       (
                           info.ID_PERGUNTA,
                           info.RESPOSTA,
                           info.CERTA
                       );
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }

            return RespId;
        }

        /// <summary>
        /// Executa um Delete com base no ID_PERGUNTA enviado
        /// </summary>
        /// <param name="RespId"></param>
        public void Delete(int RespId)
        {
            try
            {
                dc = DALHelper.GetDataContext();

                dc.PR_TB_RESPOSTAS_DELETE(RespId);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }
        }

        #endregion
    }
}
